package com.wujie.mall.domain.payment;

import lombok.Data;
import lombok.Builder;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 支付响应对象
 * 
 * @author wujie
 * @since 2024-08-26
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PaymentResponse {

    /**
     * 支付状态
     */
    public enum PaymentStatus {
        SUCCESS("success", "支付成功"),
        FAILED("failed", "支付失败"),
        PENDING("pending", "支付处理中"),
        CANCELLED("cancelled", "支付取消");

        private final String code;
        private final String message;

        PaymentStatus(String code, String message) {
            this.code = code;
            this.message = message;
        }

        public String getCode() {
            return code;
        }

        public String getMessage() {
            return message;
        }
    }

    /**
     * 是否成功
     */
    private boolean success;

    /**
     * 支付状态
     */
    private PaymentStatus status;

    /**
     * 支付单号（第三方）
     */
    private String paymentNo;

    /**
     * 订单号
     */
    private String orderNo;

    /**
     * 支付URL或表单数据
     */
    private String paymentData;

    /**
     * 错误代码
     */
    private String errorCode;

    /**
     * 错误信息
     */
    private String errorMessage;

    /**
     * 响应时间
     */
    private LocalDateTime responseTime;

    /**
     * 扩展数据
     */
    private Map<String, Object> extraData;

    /**
     * 创建成功响应
     * @param orderNo 订单号
     * @param paymentNo 支付单号
     * @param paymentData 支付数据
     * @return 支付响应
     */
    public static PaymentResponse success(String orderNo, String paymentNo, String paymentData) {
        return PaymentResponse.builder()
                .success(true)
                .status(PaymentStatus.SUCCESS)
                .orderNo(orderNo)
                .paymentNo(paymentNo)
                .paymentData(paymentData)
                .responseTime(LocalDateTime.now())
                .build();
    }

    /**
     * 创建失败响应
     * @param orderNo 订单号
     * @param errorCode 错误代码
     * @param errorMessage 错误信息
     * @return 支付响应
     */
    public static PaymentResponse failure(String orderNo, String errorCode, String errorMessage) {
        return PaymentResponse.builder()
                .success(false)
                .status(PaymentStatus.FAILED)
                .orderNo(orderNo)
                .errorCode(errorCode)
                .errorMessage(errorMessage)
                .responseTime(LocalDateTime.now())
                .build();
    }

    /**
     * 创建处理中响应
     * @param orderNo 订单号
     * @param paymentNo 支付单号
     * @return 支付响应
     */
    public static PaymentResponse pending(String orderNo, String paymentNo) {
        return PaymentResponse.builder()
                .success(true)
                .status(PaymentStatus.PENDING)
                .orderNo(orderNo)
                .paymentNo(paymentNo)
                .responseTime(LocalDateTime.now())
                .build();
    }

    /**
     * 获取扩展数据
     * @param key 数据键
     * @param defaultValue 默认值
     * @return 数据值
     */
    @SuppressWarnings("unchecked")
    public <T> T getExtraData(String key, T defaultValue) {
        if (extraData == null) {
            return defaultValue;
        }
        return (T) extraData.getOrDefault(key, defaultValue);
    }

    /**
     * 设置扩展数据
     * @param key 数据键
     * @param value 数据值
     */
    public void putExtraData(String key, Object value) {
        if (extraData == null) {
            extraData = new java.util.HashMap<>();
        }
        extraData.put(key, value);
    }
}